package com.zang.greedy;

/**
 * @author ZVerify
 * @since 2022/11/23 19:16
 * @see <a href="https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/">..</a>
 **/
public class 买卖股票的最佳时机含手续费 {

    public static void main(String[] args) {
        买卖股票的最佳时机含手续费 a = new 买卖股票的最佳时机含手续费();
        a.maxProfitDP(new int[]{1, 3, 2, 8, 4, 9},2);
    }
    // 后悔药思想这样比较通俗易懂
    public int maxProfit(int[] prices, int fee) {

        int sum = 0;
        // 初始化值，后面代表不算本钱能赚多少
        int pre = prices[0];
        for (int i = 1; i < prices.length; i++) {
            // 如果当前发现比有买入的时候比转的净赚赚的还多的就真实的卖掉然后买入
            if (prices[i] < pre) pre = prices[i];
            // 当此时的利润大于上次买的时候就后悔一下把当时的买回来然后在减去本次的手续费
            if (prices[i]-fee > pre){
                // 这里要减去之前赚的3块钱然后减去本次手续费
                sum += prices[i]-pre-fee;
                // 当前的净赚用于比较下一个值是否比当前的净赚多，如果多的话就把当前的买回来
                pre = prices[i]-fee;
            }
        }
        return sum;
    }
    public int maxProfitDP(int[] prices, int fee) {

        if (prices == null || prices.length == 0) {
            return 0;
        }
        int length = prices.length;

        int[][] dp = new int[length][2];
        dp[0][0] = 0;
        // 在买入股票的时候扣除手续费
        dp[0][1] = -prices[0] - fee;// 当前第一次买还没有卖出肯定赔钱
        for (int i = 1; i < length; i++) {
            // 没有股票的情况
            dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] + prices[i]);
            // 持有股票的情况
            dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] - prices[i] - fee);
            System.out.println(dp[i][0] + "---->" + dp[i][1] );
        }
        return dp[length - 1][0];
    }
}
